import tools from '@/tools'

/**
 * @description 校验长度
 * @author 赵致喜
 * @date 2020-03-18 12:48:29
 * @version V1.0.0
 */

/**
* @functionName  dataLengthValidation
* @param {*} value 被校验数据
* @param {Number} number 数据长度
* @return {Object} 返回结果对象
* @description 校验全部类型数据参数长度
* @author 赵致喜
* @date 2020-04-13 13:58:07
* @version V1.0.0
*/
export const dataLengthValidation = (value = '', number = 0) => {
  const strType = tools.getRawType(value)
  if (strType === 'String') {
    return stringLengthValidation(value, number)
  }
  if (strType === 'Number') {
    return numberLengthValidation(value, number)
  }
  if (strType === 'Object') {
    return objectLengthValidation(value, number)
  }
  if (strType === 'Array') {
    return arrayLengthValidation(value, number)
  }
}

/**
 * @functionName isValueType
 * @param {*} value 被校验数据
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 检测校验数据参数类型
 * @author 赵致喜
 * @date 2020-04-13 14:03:52
 * @version V1.0.0
 */

const isValueType = (value, type) => {
  const valueType = tools.getRawType(value)
  const resultObj = tools.resultObj(
    { value, type },
    false,
    `参数"value"类型不正确，请传入[${type}]类型！`
  )
  if (valueType === type) {
    resultObj.result = true
    resultObj.message = '校验成功！'
    return resultObj
  }
  return resultObj
}

/**
 * @functionName isNumberType
 * @param {Number} number 数据长度
 * @return {Object} 返回结果对象
 * @description 检测校验长度类型
 * @author 赵致喜
 * @date 2020-04-13 14:03:52
 * @version V1.0.0
 */

const isNumberType = (number) => {
  const numberType = tools.getRawType(number)
  const resultObj = tools.resultObj(
    { number },
    false,
    '参数"number"类型不正确，请传入[Number]类型！'
  )
  if (numberType === 'Number') {
    resultObj.result = true
    resultObj.message = '校验成功！'
    return resultObj
  }
  return resultObj
}

/**
 * @functionName compareData
 * @param {*} value 被校验数据
 * @param {Number} number 数据长度
 * @param {String} type 数据类型
 * @return {Object} 返回结果对象
 * @description 对传入参数与长度进行比较
 * @author 赵致喜
 * @date 2020-04-13 14:03:52
 * @version V1.0.0
 */

const compareData = (value, number, type) => {
  const numberType = isNumberType(number)
  const valueType = isValueType(value, type)
  if (!valueType.result) return valueType
  if (!numberType.result) return numberType
  const resultObj = tools.resultObj(
    { value, number, type },
    false,
    `参数"value"大于"${number}"的长度，请输入小于${number}的参数！`
  )
  if (numberType.result && valueType.result) {

    if (
      (type === 'String' && value.length <= number) ||
      (type === 'Number' && value <= number) ||
      (type === 'Object' && value.length <= number) ||
      (type === 'Array' && value.length <= number)
    ) {
      resultObj.result = true
      resultObj.message = '校验成功！'
      return resultObj
    }
  }
  return resultObj
}

/**
 * @functionName stringLengthValidation
 * @param {String} value 被校验数据
 * @param {Number} number 数据长度
 * @return {Object} 返回结果对象
 * @description 校验数据为String类型时，数据是否正确
 * @author 赵致喜
 * @date 2020-04-13 09:00:13
 * @version V1.0.0
 */

export const stringLengthValidation = (value = '', number = 0) => {
  return compareData(value, number, 'String')
}

/**
 * @functionName numberLengthValidation
 * @param {Number} value 被校验数据
 * @param {Number} number 数据长度
 * @return {Object} 返回结果对象
 * @description 校验数据为Number类型时，数据是否正确
 * @author 赵致喜
 * @date 2020-04-13 15:58:23
 * @version V1.0.0
 */

export const numberLengthValidation = (value = 0, number = 0) => {
  return compareData(value, number, 'Number')
}

/**
 * @functionName objectLengthValidation
 * @param {Object} value 被校验数据
 * @param {Number} number 数据长度
 * @return {Object} 返回结果对象
 * @description 校验数据为Object类型时，数据是否正确
 * @author 赵致喜
 * @date 2020-04-13 20:49:14
 * @version V1.0.0
 */
export const objectLengthValidation = (value = {}, number = 0) => {
  return compareData(value, number, 'Object')
}

/**
 * @functionName arrayLengthValidation
 * @param {Array} value 被校验数据
 * @param {Number} number 数据长度
 * @return {Object} 返回结果对象
 * @description 校验数据为Array类型时，数据是否正确
 * @author 赵致喜
 * @date 2020-04-13 20:49:14
 * @version V1.0.0
 */
export const arrayLengthValidation = (value = [], number = 0) => {
  return compareData(value, number, 'Array')
}
